package interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//拦截器可以在容器（这里应该是指tomcat）多次调用。
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    // 在拦截点执行前拦截
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {

        //这里获取请求的url地址，是为了在后面判定的时候跳转到登陆界面后可以放行，而不会拦截，避免死循环问题
        String urlString = httpServletRequest.getRequestURI();

//        HttpSession session = httpServletRequest.getSession();
//        Object a = session.getAttribute("loginUser");

        //这里可以根据session的用户来判断角色的权限，根据权限来转发不同的页面
        //这里我加入页面的对应的controller的映射名来保证在有可能没有session的情况下，也能跳转到登录页面
        if(httpServletRequest.getSession().getAttribute("loginUser") != null
                || urlString.indexOf("login")!=-1
                || urlString.indexOf("validation")!=-1
                || urlString.indexOf("register")!=-1
                || urlString.indexOf("identify")!=-1
                ) {

            //true表示继续流程（如调用下一个拦截器或处理器）
            return true;
        }else {

            //如果没有userId这个session(或者过期了)，就转发到登录页面，放行（这里我用的是重定向）
            //请求转发
//            httpServletRequest.getRequestDispatcher("login").forward(httpServletRequest,httpServletResponse);
            //重定向
            httpServletResponse.sendRedirect("/login");

            //false表示流程中断（如登录检查失败），不会继续调用其他的拦截器或处理器
            return false;
        }

    }

    @Override
    // 在处理过程中，执行拦截
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    // 执行完毕，返回前拦截
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}
